#include <iostream>
#include <vector>
// 1

int main()
{
    std::vector<int> v;
    // std::cout<<v.size()<<std::endl;     // 大小
    // std::cout<<v.capacity()<<std::endl; // 容量

    v.push_back(1); // 尾插法
    v.push_back(2);
    v.push_back(3);
    // 没有头插
    // 标准库接口尽量满足O（1）

    // for (int i = 0; i < v.size(); i++)
    // {
    //     std::cout << v[i] << " ";
    // }
    // std::cout << std::endl;

    std::vector<int>::iterator ite_b = v.begin(); // 头部迭代器：指向容器的的第一个元素
    std::vector<int>::iterator ite_e = v.end();   // 尾部迭代器：指向容器的最后一个元素的下一个位置 左闭右开区间

    // 自动类型推导 auto 根据等号右边的赋值自动推导它的数据类型
    // auto a = 10;

    auto ite = v.begin();
    std::cout << *(ite + 1) << std::endl; // 能找到下一个位置 （end-1 是最后一个元素）  随机迭代器：重载了+ - 的迭代器

    // 中间插入
    v.insert(v.begin() + 1, 99); // v.begin() + 1:第二个位置插入  中间插入

    // 迭代器失效问题：当指向的容器元素删除之后，该迭代器不能继续使用 返回值是下一个迭代器
    // 删除
    for (auto ite = v.begin(); ite != v.end();) // 适用于所有容器的按值删除写法
    {
        if (*ite == 2)
        {
            ite = v.erase(ite); // 返回值是下一个迭代器，所以需要将值直接给下一个
        }
        else
        {
            ite++;
        }
    }
    v.pop_back(); // 尾删
    // v.erase(v.begin() + 1); // 按位置删除
    v.shrink_to_fit(); // 将容量缩减到合适大小

    // for (std::vector<int>::iterator ite = v.begin(); ite != v.end(); ite++)
    for (auto ite = v.begin(); ite != v.end(); ite++)
    {
        std::cout << *ite << " ";
    }
    std::cout << std::endl;

    return 0;
}
